<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="generator" content="pandoc">
  <meta name="author" content="滨州学院">
  <title>实用软件工程</title>
  <meta name="apple-mobile-web-app-capable" content="yes">
  <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, minimal-ui">
  <link rel="stylesheet" href="reveal.js/css/reset.css">
  <link rel="stylesheet" href="reveal.js/css/reveal.css">
  <style>
      code{white-space: pre-wrap;}
      span.smallcaps{font-variant: small-caps;}
      span.underline{text-decoration: underline;}
      div.column{display: inline-block; vertical-align: top; width: 50%;}
  </style>
  <link rel="stylesheet" href="reveal.js/css/theme/white.css" id="theme">
  <!-- Printing and PDF exports -->
  <script>
    var link = document.createElement( 'link' );
    link.rel = 'stylesheet';
    link.type = 'text/css';
    link.href = window.location.search.match( /print-pdf/gi ) ? 'reveal.js/css/print/pdf.css' : 'reveal.js/css/print/paper.css';
    document.getElementsByTagName( 'head' )[0].appendChild( link );
  </script>
  <!--[if lt IE 9]>
  <script src="reveal.js/lib/js/html5shiv.js"></script>
  <![endif]-->
</head>
<body>
  <div class="reveal">
    <div class="slides">

<section id="title-slide">
  <h1 class="title">实用软件工程</h1>
  <p class="subtitle">CH01 软件工程概述</p>
  <p class="author">滨州学院</p>
</section>

<section id="学习目标" class="slide level2">
<h2>学习目标</h2>
<ul>
<li>掌握：几种典型的软件开发模型和软件生命周期各个阶段任务和活动。</li>
<li>熟悉：软件危机的表现，产生软件危机的原因。</li>
<li>了解：软件的发展阶段，软件的特点。</li>
</ul>
</section>
<section><section id="软件与软件危机" class="title-slide slide level1"><h1>1.1 软件与软件危机</h1></section><section id="软件" class="slide level2">
<h2>软件</h2>
<dl>
<dt>软件</dt>
<dd>软件是包括程序、数据及相关文档的完整集合。
</dd>
</dl>
</section><section id="软件的特点" class="slide level2">
<h2>软件的特点</h2>
<ul>
<li>软件是一种逻辑产品</li>
<li>没有明显的制作过程</li>
<li>不存在磨损、老化问题</li>
<li>对计算机系统具有依赖性</li>
<li>软件产品的生产主要是脑力劳动</li>
<li>软件复杂性高，成本昂贵</li>
<li>软件开发还涉及诸多社会因素</li>
</ul>
</section><section id="软件的发展" class="slide level2">
<h2>软件的发展</h2>
<ul>
<li>程序设计时代（1950s–1960s)</li>
<li>软件系统时代（1960s–1970s）</li>
<li>软件工程时代（1970s–1980s）</li>
<li>现代软件工程时代（1980s–now）</li>
</ul>
</section><section id="软件危机产生" class="slide level2">
<h2>软件危机–产生</h2>
<ul>
<li>1960s 中期以后
<ul>
<li>计算机硬件技术进步</li>
<li>软件需求迫切</li>
</ul></li>
<li>大型软件开发过程中出现的三大难题
<ul>
<li>复杂程度高</li>
<li>研制周期长</li>
<li>正确性难以保证</li>
</ul></li>
</ul>
</section><section id="软件危机" class="slide level2">
<h2>软件危机</h2>
<dl>
<dt>软件危机</dt>
<dd>是指计算机软件在开发和维护过程中所遇到的一系列严重问题。
</dd>
</dl>
</section><section id="软件危机表现" class="slide level2">
<h2>软件危机–表现</h2>
<ul>
<li>对软件的开发成本和进度的估计常常无法控制</li>
<li>用户对“已完成的”软件系统不满意的现象经常发生</li>
<li>软件产品的质量常常不可靠</li>
<li>软件常常是不可维护的</li>
<li>软件通常没有适当的文档资料</li>
<li>软件成本在计算机系统总成本中所占的比例逐年上升</li>
<li>软件开发速度跟不上计算机发展速度和人们对软件的需求</li>
</ul>
</section><section id="软件危机原因" class="slide level2">
<h2>软件危机–原因</h2>
<ul>
<li>软件开发规模越来越大，结构越来越复杂</li>
<li>用户需求不明确且在不断变化</li>
<li>缺乏正确的理论方法指导</li>
<li>代码文档贫乏</li>
<li>软件开发工具存在问题</li>
</ul>
</section></section>
<section><section id="软件工程概述" class="title-slide slide level1"><h1>1.2 软件工程概述</h1></section><section id="软件工程" class="slide level2">
<h2>软件工程</h2>
<ul>
<li>1968年秋，NATO会议，正式提出“软件工程”一词。</li>
</ul>
</section><section class="slide level2">

<dl>
<dt>软件工程</dt>
<dd>软件工程是应用于计算机软件的定义、开发和维护的一整套方法、工具、文档、实践标准和工序。— GB
</dd>
</dl>
<div class="fragment">
<dl>
<dt>软件工程</dt>
<dd>软件工程是建立并使用完善的工程化原则，以较经济的手段获得能在实际机器上有效运行的可靠软件的一系列方法。— NATO
</dd>
</dl>
</div>
<div class="fragment">
<dl>
<dt>软件工程</dt>
<dd>软件工程是（1）将系统的、规范的、可度量的方法应用于软件的开发、运行和维护过程，即将工程化应用于软件；（2）对（1）中所述方法进行研究。— IEEE
</dd>
</dl>
</div>
</section><section id="软件工程目标" class="slide level2">
<h2>软件工程目标</h2>
<ul>
<li>成功创建一个软件系统
<ul>
<li>花费较低的成本，获得较好的软件性能</li>
<li>开发的软件满足用户的需求、易于移植、可靠性高、维护方便且费用较低</li>
<li>能按时完成开发任务，及时交付使用</li>
</ul></li>
</ul>
<div class="fragment">
<ul>
<li>各个目标之间相互制约，要力求平衡</li>
</ul>
</div>
</section><section id="软件工程原理" class="slide level2">
<h2>软件工程原理</h2>
<ul>
<li>抽象</li>
<li>信息隐藏</li>
<li>模块化</li>
<li>局部化</li>
<li>确定性</li>
<li>一致性</li>
<li>完备性</li>
<li>可验证性</li>
</ul>
</section><section id="软件工程的基本原则" class="slide level2">
<h2>软件工程的基本原则</h2>
<ul>
<li class="fragment">用分阶段的生存周期计划严格管理</li>
<li class="fragment">坚持进行阶段评审</li>
<li class="fragment">实行严格的产品控制</li>
<li class="fragment">采用现代程序设计技术</li>
<li class="fragment">结果应能清楚地审查</li>
<li class="fragment">开发小组的人员应该少而精</li>
<li class="fragment">承认不断改进软件工程实践的必要性</li>
</ul>
</section><section id="软件工程的内容" class="slide level2">
<h2>软件工程的内容</h2>
<ul>
<li>软件开发技术</li>
<li>软件开发管理</li>
</ul>
</section></section>
<section><section id="软件开发方法和理论" class="title-slide slide level1"><h1>1.3 软件开发方法和理论</h1></section><section id="软件工程的三种开发方法" class="slide level2">
<h2>软件工程的三种开发方法</h2>
<ul>
<li>结构化方法</li>
<li>面向数据结构方法</li>
<li>面向对象方法</li>
</ul>
</section><section id="结构化方法" class="slide level2">
<h2>结构化方法</h2>
<ul>
<li>结构化分析
<ul>
<li>自顶向下、逐步求精</li>
<li>分解和抽象</li>
<li>数据流图建模</li>
</ul></li>
<li>结构化设计
<ul>
<li>数据流图为基础实现概要设计</li>
</ul></li>
<li>结构化程序设计
<ul>
<li>顺序、选择、循环结构</li>
<li>实现详细设计</li>
</ul></li>
</ul>
</section><section class="slide level2">

<ul>
<li>结构化方法的基本思想是自顶向下、逐步求精。</li>
<li>指导原则是功能的分解和抽象。</li>
</ul>
</section><section id="面向数据结构方法" class="slide level2">
<h2>面向数据结构方法</h2>
<ul>
<li>用数据结构作为程序设计的基础</li>
<li>从目标系统的输入、输出数据结构入手，导出程序框架结构，再补充其他细节</li>
</ul>
</section><section id="面向对象方法" class="slide level2">
<h2>面向对象方法</h2>
<ul>
<li>基本思想
<ul>
<li>从现实世界中客观存在的事物（即对象）出发来构造软件系统</li>
</ul></li>
<li>对象是认识问题、分析问题、解决问题的核心</li>
<li>运用对象、类、封装、继承、多态和消息传递等概念来构造、测试、重构软件</li>
</ul>
</section><section id="软件工程的五个面向理论" class="slide level2">
<h2>软件工程的五个面向理论</h2>
<ul>
<li>面向流程分析</li>
<li>面向数据设计</li>
<li>面向对象实现</li>
<li>面向功能测试</li>
<li>面向过程管理</li>
</ul>
</section></section>
<section><section id="软件生存周期" class="title-slide slide level1"><h1>1.4 软件生存周期</h1></section><section id="软件生存周期的定义" class="slide level2">
<h2>软件生存周期的定义</h2>
<dl>
<dt>软件生存周期</dt>
<dd>软件产品从提出、实现、使用、维护到停止使用退役的整个过程称为<strong>软件生存周期</strong>。
</dd>
<dd>包括<strong>可行性研究</strong>、<strong>需求分析</strong>、<strong>概要设计</strong>、<strong>详细设计</strong>、<strong>编码实现</strong>、<strong>软件测试</strong>、<strong>投入使用和后期维护</strong>等活动过程。
</dd>
<dd>软件生存周期还可以划分为<strong>软件定义</strong>、<strong>软件开发</strong>和<strong>软件运行维护</strong>三大阶段。
</dd>
</dl>
</section><section id="软件生存周期阶段划分的原则" class="slide level2">
<h2>软件生存周期阶段划分的原则</h2>
<ul>
<li>各个阶段的任务尽可能相对独立</li>
<li>简化各个阶段的关系</li>
<li>使一个阶段内的任务尽可能相同</li>
<li>降低每个阶段任务的复杂程度</li>
</ul>
</section><section id="软生存周期各阶段的任务" class="slide level2">
<h2>软生存周期各阶段的任务</h2>
<ul>
<li>可行性研究及项目初步计划</li>
<li>需求分析</li>
<li>概要设计</li>
<li>详细设计</li>
<li>软件实现</li>
<li>软件测试</li>
<li>使用和维护</li>
</ul>
</section><section class="slide level2">

<ul>
<li>每个阶段要明确
<ul>
<li>什么<strong>人</strong>做什么<strong>事</strong></li>
<li>产生哪些<strong>文档</strong></li>
</ul></li>
</ul>
</section><section id="可行性研究及项目初步计划" class="slide level2">
<h2>可行性研究及项目初步计划</h2>
<ul>
<li>用户和咨询人员：确定待开发系统的
<ul>
<li>开发目标、性质、规模和总的要求</li>
<li>要解决的问题</li>
</ul></li>
<li>系统分析人员和用户：探讨要开发的项目
<ul>
<li>是否值得去做</li>
<li>是否有可行的解决办法</li>
<li>对软件开发成本、可获得效益、开发进度等做出估量</li>
<li>写出可行性研究报告连同项目开发的实施计划一同提交有关部门评审</li>
</ul></li>
</ul>
</section><section class="slide level2">

<ul>
<li>产生的文档
<ul>
<li>可行性研究报告</li>
<li>项目开发实施计划</li>
</ul></li>
</ul>
</section><section id="需求分析" class="slide level2">
<h2>需求分析</h2>
<ul>
<li>系统分析员与用户
<ul>
<li>密切配合，充分理解用户的工作业务流程和工作职责范围</li>
<li>收集准确、完整的用户工作业务数据和资料</li>
<li>分析出用户对软件系统的需求</li>
<li>写出软件需求规格说明书及初步的用户手册，提交评审</li>
</ul></li>
</ul>
</section><section class="slide level2">

<ul>
<li>需求分析阶段产生的文档
<ul>
<li>软件需求规格说明书</li>
<li>用户手册</li>
</ul></li>
</ul>
</section><section id="概要设计" class="slide level2">
<h2>概要设计</h2>
<ul>
<li>系统设计人员
<ul>
<li>反复推敲、理解用户的需求，给出软件总体结构（划分功能模块）
<ul>
<li>软件由哪些模块组成</li>
<li>模块之间的层次结构怎样</li>
<li>如何联系、调用</li>
<li>确定每个模块的功能</li>
</ul></li>
<li>对工作量和进度进行评估</li>
<li>编写概要设计说明书提交评审</li>
</ul></li>
</ul>
</section><section class="slide level2">

<ul>
<li>概要设计阶段产生的文档
<ul>
<li>概要设计说明书</li>
</ul></li>
</ul>
</section><section id="详细设计" class="slide level2">
<h2>详细设计</h2>
<ul>
<li>设计人员
<ul>
<li>对每个模块的功能进行具体描述</li>
<li>把功能描述转换为结构化的过程描述，确定每个模块内部的控制结构
<ul>
<li>先干什么，后干什么</li>
<li>有多少个条件判断</li>
<li>多少个循环处理</li>
</ul></li>
<li>设计数据结构和数据库</li>
<li>提交详细设计说明书和测试计划初稿进行评审</li>
</ul></li>
</ul>
</section><section class="slide level2">

<ul>
<li>详细设计阶段产生的文档
<ul>
<li>详细设计说明书</li>
<li>测试计划</li>
</ul></li>
</ul>
</section><section id="软件实现" class="slide level2">
<h2>软件实现</h2>
<ul>
<li>开发人员：编码
<ul>
<li>选择合适的计算机编程语言将每个模块的控制结构转换成计算机可以接受的程序代码</li>
<li>注意程序结构合理、易读易懂、与设计的要求一致</li>
<li>编写用户手册、操作手册等面向用户的文档</li>
</ul></li>
<li>软件实现阶段产生的文档
<ul>
<li>用户手册</li>
<li>操作手册</li>
</ul></li>
</ul>
</section><section id="软件测试" class="slide level2">
<h2>软件测试</h2>
<ul>
<li>测试人员
<ul>
<li>设计<strong>测试用例</strong>，尽可能多地、尽可能早地<strong>发现</strong>软件中各个组成部分的<strong>错误</strong></li>
<li>测试分为：<strong>单元测试</strong>、<strong>集成测试</strong>、<strong>确认测试</strong>、<strong>系统测试</strong>和<strong>验收测试</strong></li>
</ul></li>
<li>软件测试阶段产生的文档
<ul>
<li>测试计划</li>
<li>详细测试方案</li>
<li>实际测试结果</li>
</ul></li>
</ul>
</section><section id="使用和维护" class="slide level2">
<h2>使用和维护</h2>
<ul>
<li>实施人员、用户和维护人员
<ul>
<li>软件实施，投入运行</li>
<li>用户使用软件</li>
<li>软件维护</li>
</ul></li>
</ul>
</section></section>
<section><section id="软件开发模型" class="title-slide slide level1"><h1>软件开发模型</h1></section><section id="软件开发模型-1" class="slide level2">
<h2>软件开发模型</h2>
<dl>
<dt>软件开发模型</dt>
<dd>也称为软件生成周期模型，就是描述软件开发过程中各种活动如何执行的模型。
</dd>
<dd>如：瀑布模型、增量模型、螺旋模型、快速原型模型和喷泉模型等。
</dd>
</dl>
</section><section id="瀑布模型" class="slide level2">
<h2>瀑布模型</h2>
</section><section id="增量模型" class="slide level2">
<h2>增量模型</h2>
</section><section id="螺旋模型" class="slide level2">
<h2>螺旋模型</h2>
</section><section id="快速原型模型" class="slide level2">
<h2>快速原型模型</h2>
</section><section id="喷泉模型" class="slide level2">
<h2>喷泉模型</h2>
</section><section id="统一过程" class="slide level2">
<h2>统一过程</h2>
</section></section>
    </div>
  </div>

  <script src="reveal.js/js/reveal.js"></script>

  <script>

      // Full list of configuration options available at:
      // https://github.com/hakimel/reveal.js#configuration
      Reveal.initialize({
        // Push each slide change to the browser history
        history: true,

        // Optional reveal.js plugins
        dependencies: [
          { src: 'reveal.js/lib/js/classList.js', condition: function() { return !document.body.classList; } },
          { src: 'reveal.js/plugin/zoom-js/zoom.js', async: true },
          { src: 'reveal.js/plugin/notes/notes.js', async: true }
        ]
      });
    </script>
    </body>
</html>
